///PHILOTES Source Code.  (C)2012 PhiloLabs
#pragma once

#ifndef _RenderOperation_H__
#define _RenderOperation_H__

#include "OgrePrerequisites.h"
#include "OgreVertexIndexData.h"

namespace Ogre {


	
	
	
	class _OgrePrivate RenderOperation {
	public:
		/// The rendering operation type to perform
		enum OperationType {
			/// A list of points, 1 vertex per point
            OT_POINT_LIST = 1,
			/// A list of lines, 2 vertices per line
            OT_LINE_LIST = 2,
			/// A strip of connected lines, 1 vertex per line plus 1 start vertex
            OT_LINE_STRIP = 3,
			/// A list of triangles, 3 vertices per triangle
            OT_TRIANGLE_LIST = 4,
			/// A strip of triangles, 3 vertices for the first triangle, and 1 per triangle after that 
            OT_TRIANGLE_STRIP = 5,
			/// A fan of triangles, 3 vertices for the first triangle, and 1 per triangle after that
            OT_TRIANGLE_FAN = 6
        };

		/// Vertex source data
		VertexData *vertexData;

		/// The type of operation to perform
		OperationType operationType;

		
		bool useIndexes;

		/// Index data - only valid if useIndexes is true
		IndexData *indexData;
		/// Debug pointer back to renderable which created this
		const Renderable* srcRenderable;

		/// The number of instances for the render operation - this option is supported 
		/// in only a part of the render systems.
		size_t numberOfInstances;

        /// a flag to indicate that it is possible for this operation to use a global
        /// vertex instance buffer if available. 
        bool useGlobalInstancingVertexBufferIsAvailable;

        RenderOperation() :
            vertexData(0), operationType(OT_TRIANGLE_LIST), useIndexes(true),
                indexData(0), srcRenderable(0), numberOfInstances(1),
                useGlobalInstancingVertexBufferIsAvailable(true) {}


	};
	
	
}



#endif
